using System.Text.RegularExpressions;
using BomComparison.Core.Attributes;

//定义元器件属性类
namespace BomComparison.Core.Model;

public partial class BomItem
{
    private string _partNumber = string.Empty;
    private float _partQuantity;
    private string _partReference = string.Empty;


    //PartReference 的合法格式需要满足以下规则：
    //  1.以字母开头，支持多个字母的前缀（如 CD）。
    //  2.以数字结尾。
    //  3.每个分隔符之间的部分（子字符串）必须符合上述规则。
    //  4.子字符串之间用逗号（,）分隔。
    //  5.允许单个子字符串（没有逗号）。
    private static readonly Regex s_partReferenceRegex = CreatePartReferenceRegex();

    [GeneratedRegex("^[a-zA-Z]+[0-9]+(?:,[a-zA-Z]+[0-9]+)*$")]
    private static partial Regex CreatePartReferenceRegex();

    /// <summary>
    /// 表示 BOM 中的物料编号，用于唯一标识元器件。
    /// </summary>
    public string PartNumber
    {
        get => _partNumber;
        set => _partNumber = !string.IsNullOrWhiteSpace(value) ? value.Trim()
            : throw new ArgumentNullException(nameof(value), "PartNumber 不能为空或仅包含空白字符");
    }

    /// <summary>
    /// 表示 BOM 中的物料数量，必须为非负数。
    /// </summary>
    public float PartQuantity
    {
        get => _partQuantity;
        set => _partQuantity = value >= 0 ? value
            : throw new ArgumentOutOfRangeException(nameof(value), "PartQuantity 不能为负数");
    }

    /// <summary>  
    /// 表示 BOM 中的物料位号，用于标识元器件在电路板上的位置。
    /// 检查字符串是否为 null、空字符串 ("")，或仅包含空白字符（如空格、制表符等）。
    /// </summary>  
    [ColumnName("PartReference")]
    public string PartReference
    {
        get => _partReference;
        set
        {
            if (!string.IsNullOrWhiteSpace(value) && !s_partReferenceRegex.IsMatch(value))
            {
                throw new ArgumentException("PartReference 必须是以字母开头、数字结尾，子字符串之间用逗号分隔的格式", nameof(value));
            }
            _partReference = value?.Trim() ?? string.Empty;
        }
    }

    [ColumnName("PartDescription")]
    public string PartDescription { get; set; } = string.Empty;

    [ColumnName("Value")]
    public string Value { get; set; } = string.Empty;

    public string AlternatePNs { get; set; } = string.Empty; // 替代料列表  
    [ColumnName("PartValue")]
    public string PartValue { get; set; } = string.Empty;

    [ColumnName("PartAlternatePNs")]
    public string PartAlternatePNs { get; set; } = string.Empty;

    public BomItem()
    {

    }

    public BomItem(string partNumber, float partQuantity, string partReference, string description)
    {
        PartNumber = ValidatePartNumber(partNumber);
        PartQuantity = ValidatePartQuantity(partQuantity);
        PartReference = ValidatePartReference(partReference);
        PartDescription = description?.Trim() ?? string.Empty;
    }

    private string ValidatePartNumber(string partNumber)
    {
        if (string.IsNullOrWhiteSpace(partNumber))
            throw new ArgumentNullException(nameof(partNumber), "PartNumber 不能为空或仅包含空白字符");
        return partNumber.Trim();
    }

    private float ValidatePartQuantity(float partQuantity)
    {
        if (partQuantity < 0)
            throw new ArgumentOutOfRangeException(nameof(partQuantity), "PartQuantity 不能为负数");
        return partQuantity;
    }

    private string ValidatePartReference(string partReference)
    {
        if (!string.IsNullOrWhiteSpace(partReference) && !s_partReferenceRegex.IsMatch(partReference))
            throw new ArgumentException("PartReference 必须是以字母开头、数字结尾，子字符串之间用逗号分隔的格式", nameof(partReference));
        return partReference?.Trim() ?? string.Empty;
    }



}
